package world.liquor.service;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import world.liquor.dao.RecommendDAO;
import world.liquor.domain.BeerAssessment;
import world.liquor.domain.BeerInfo;

@Service
public class RecommendServiceImpl implements RecommendService {
	
	@Autowired
	private RecommendDAO dao;
	public void setDao(RecommendDAO dao) {
		this.dao = dao;
	}
	public RecommendServiceImpl() {
	}
	public RecommendServiceImpl(RecommendDAO dao) {
		this.dao = dao;
	}
	// 맥주 추천
	public HashMap<String, BeerInfo> beerRecommend(String memberId) throws Exception{
		HashMap<String, BeerInfo> bAbeerInfoId = new HashMap<String, BeerInfo>();
		
		// 맥주 평가지 조회 by 회원 id
		ArrayList<BeerAssessment> beerAsList=dao.selectBeerAssessmentbyMemberId(memberId);
		
		// 맥주정보 조회 by 평가되지 않은 맥주
		ArrayList<BeerInfo> beerInfoRemoveList =dao.selectBeerInfobyremovebeerAssessmentIdOfMemberIdList(memberId);
		//평가지에 있는 맥주 정보 ID 저장할 객체
		String beerInfoId=null;
		// 조건에 충족하는 맥주ID를 저장할 객체
		BeerInfo beerInfo= null;
		//맥주 ID로 찾은 맥주 정보를 저장할 객체
		BeerInfo reBeerInfo=null;
		int sw=0;
		int bi=0;
		int sor=0;
		int co=0;
		// 맥주 평가지 조회 by 회원 id - 회원이 맥주 평가를 안한 경우
		if(beerAsList.size()==0){
			throw new Exception("회원님이 평가한 맥주가 없습니다.");
		}
		// 맥주정보 조회 by 평가되지 않은 맥주 - 회원이 모든 맥주를 평가한 경우
		if(beerAsList.size()==0){
			throw new Exception("회원님께서 모든 맥주를 드셨습니다.");
		}
		
		// 평가 점수 3점 이상만 추천 알고리즘에 넣는다.
		for(int i=0; i<beerAsList.size(); i++){
			if( (beerAsList.get(i)).getAssessment() >= 3){
				// 평가지의 평점이 3점 이상만 ID 출력
				beerInfoId=(beerAsList.get(i)).getBeerInfoId();
				
				// 평가지의 맥주 ID로 맥주 정보 찾기
				beerInfo=dao.selectBeerInfobyBeerInfoId(beerInfoId);
				sw=beerInfo.getBitters();
				bi=beerInfo.getBitters();
				sor=beerInfo.getSensationOfRefreshment();
				co=beerInfo.getColor();
				// 위에 받아온 맥주 정보를 회원이 평가 안한 맥주들과 비교한다.
				for(int j=0; j<beerInfoRemoveList.size() ; j++){
					reBeerInfo=beerInfoRemoveList.get(j);
					if(reBeerInfo.getSweetness()-1<=bi && bi<=reBeerInfo.getSweetness()+1){
						bAbeerInfoId.put(reBeerInfo.getBeerInfoId(), reBeerInfo);
					}
					if(reBeerInfo.getBitters()-1<=sw && sw<=reBeerInfo.getBitters()+1){
						bAbeerInfoId.put(reBeerInfo.getBeerInfoId(), reBeerInfo);
					}	
					if(reBeerInfo.getSensationOfRefreshment()-1<=sor && sor<=reBeerInfo.getSensationOfRefreshment()+1){
						bAbeerInfoId.put(reBeerInfo.getBeerInfoId(), reBeerInfo);
					}
					if(reBeerInfo.getColor()-1<=co && co<=reBeerInfo.getColor()+1){
						bAbeerInfoId.put(reBeerInfo.getBeerInfoId(), reBeerInfo);
					}
				}
				
			}
		}
		// 추천할 맥주가 없다면
		if(bAbeerInfoId.size()==0){
			throw new Exception("추천할 맥주가 없습니다.");
		}
		return bAbeerInfoId;
	}
	
	// 평가지에서 평균 점수가 높은 맥주 조회
	public HashMap beerBest() throws SQLException{
		// 결과 값을 담을 객체
		HashMap beerInfo =new HashMap();
		
		// 모든 맥주 정보 조회
		ArrayList<BeerInfo> beerInfoAll=dao.selectBeerInfoAll();
		// 모든 평가지 조회
		ArrayList<BeerAssessment> beerAs=dao.selectbeerAssessmentAll();
		int score=0;
		int div=0;
		BigDecimal bds;
		BigDecimal dbdiv;
		BigDecimal result;
		
		HashMap beerInfoBe=new HashMap();
		
		for(int j=0; j<beerInfoAll.size(); j++){
			for(int i=0; i<beerAs.size(); i++){
				if(beerInfoAll.get(j).getBeerInfoId().equals(beerAs.get(i).getBeerInfoId())){
				  score=score+beerAs.get(i).getAssessment();
				  div++;
				}
			}
			if(div!=0){
				bds= new BigDecimal(score);
				dbdiv=new BigDecimal(div);
				result=bds.divide(dbdiv, 2, BigDecimal.ROUND_HALF_UP);
				beerInfoBe.put(beerInfoAll.get(j).getBeerInfoId(), result.doubleValue());
			}			
			score=0;
			div=0;
		}
		double max=0;
		String maxId=null;
		Iterator <Entry> iter=beerInfoBe.entrySet().iterator();
		while(iter.hasNext()){
			Entry Entry =iter.next();
			if(max<(double)Entry.getValue()){
				max=(double) Entry.getValue();
				maxId=(String)Entry.getKey();
			}
		}
		BeerInfo beerInfoBest=dao.selectBeerInfobyBeerInfoId(maxId);
		
		beerInfo.put("Best", max);
		beerInfo.put("BeerInfo", beerInfoBest);
		
		return beerInfo;
	}


}
